import _ from 'lodash'
import qs from 'qs'
import { AxiosResponse, InternalAxiosRequestConfig } from '@/types/axios-types'
import { AxiosConst } from '@/constants/framework/axios-const'
import { objToFormData } from '@/utils/obj-util'
import { useUserStore } from '@/store/modules/user-store'
//请求拦截器-处理参数
const defaultRequestInterceptors = (config: InternalAxiosRequestConfig) => {
  // 请求方式-Get
  if (config.method === 'get' && config.params) {
    const query = Object.keys(config.params)
      .filter((key) => config.params[key] !== void 0 && config.params[key] !== null)
      .reduce((prev, key, index, array) => {
        const value = encodeURIComponent(_.isPlainObject(config.params[key]) ? JSON.stringify(config.params[key]) : config.params[key])
        prev += `${key}=${value}${index < array.length - 1 ? '&' : ''}`
        return prev
      }, '?')
    config.params = {}
    config.url += query
  }
  // 请求方式-Post
  if (config.method === 'post' && AxiosConst.TRANSFORM_REQUEST_DATA) {
    if (config.headers['Content-Type'] === 'application/x-www-form-urlencoded') {
      config.data = qs.stringify(config.data)
    }
    if (config.headers['Content-Type'] === 'multipart/form-data' && !(config.data instanceof FormData)) {
      config.data = objToFormData(config.data)
    }
  }
  return config
}
const defaultResponseInterceptors = (response: AxiosResponse) => {
  if (response?.config?.responseType === 'blob') {
    // 如果是文件流，直接过
    return response
  } else if (response.data.code === AxiosConst.API_SUCCESS_CODE) {
    return response.data
  } else if (response.data.code == 401 || response.data.code == 403) {
    setTimeout(() => {
      useUserStore().logout()
      location.reload()
    }, 500)
    return Promise.reject(response.data)
  } else {
    // TODO 错误处理
    return Promise.reject(response.data)
    // 请求成功
    // 'success' => 200,
    // 未登录
    // 'not_logged' => 401,
    // 没有权限访问
    // 'not_permission' => 403,
    // 服务器内部错误
    // 'error' => 500,
  }
}
export { defaultResponseInterceptors, defaultRequestInterceptors }
